#include "inputcontext.h"
#include <QDebug>

// 静态成员初始化
InputContext* InputContext::m_instance = nullptr;
QMutex InputContext::m_instanceMutex;

InputContext::InputContext(QObject *parent) : QObject(parent)
{
    // 初始化核心依赖组件
    m_pinyinHandler = new PinyinHandler();
    m_dictHandler = DictHandler::getInstance();
    m_openccUtil = OpenCCUtil::getInstance();
    m_baiduApi = BaiduPinyinApi::getInstance();

    // 绑定组件信号
    connect(m_pinyinHandler, &PinyinHandler::processFinished, this, &InputContext::onPinyinProcessed);
    connect(m_dictHandler, &DictHandler::dictUpdated, this, &InputContext::onDictUpdated);

    // 从ConfigManager加载初始配置
    ConfigManager* config = ConfigManager::getInstance();
    // 初始拼音类型
    QString pinyinTypeStr = config->getValue(InputMethodGroup, "PinyinType", "FullPinyin").toString();
    PinyinType initType = (pinyinTypeStr == "DoublePinyin") ? PinyinType::DoublePinyin :
                         (pinyinTypeStr == "SimplePinyin") ? PinyinType::SimplePinyin : PinyinType::FullPinyin;
    setInputMode(initType);

    // 初始简繁方向
    int dirInt = config->getValue(InputMethodGroup, "ConvertDirection", 0).toInt();
    syncConvertDirection(static_cast<OpenCCUtil::ConvertDirection>(dirInt));

    // 初始百度API开关
    bool useBaidu = config->getValue(InputMethodGroup, "UseBaiduApi", true).toBool();
    syncUseBaiduApi(useBaidu);

    qInfo() << "[InputContext] 初始化完成：拼音类型=" << pinyinTypeStr 
            << "，简繁方向=" << dirInt 
            << "，百度API=" << (useBaidu ? "启用" : "禁用");
}

InputContext* InputContext::getInstance(QObject *parent)
{
    if (!m_instance) {
        QMutexLocker locker(&m_instanceMutex);
        if (!m_instance) {
            m_instance = new InputContext(parent);
        }
    }
    return m_instance;
}

InputContext::~InputContext()
{
    delete m_pinyinHandler;
    qInfo() << "[InputContext] 析构完成";
}

// 处理按键输入（核心入口）
void InputContext::processKeyPress(const QString& key)
{
    if (!isValidKey(key)) {
        return;
    }

    // 处理退格键
    if (key == "Backspace") {
        if (!m_composingText.isEmpty()) {
            m_composingText.chop(1);
            emit compositionUpdated(m_composingText);
            // 剩余拼音需重新解析
            if (!m_composingText.isEmpty()) {
                m_pinyinHandler->processInput(m_composingText);
            } else {
                // 拼音为空时清空候选词
                m_currentCandidates.clear();
                emit candidatesUpdated(m_currentCandidates);
                m_isComposing = false;
            }
        }
        return;
    }

    // 处理确认键（空格/回车）
    if (key == " " || key == "Enter") {
        if (!m_currentCandidates.isEmpty()) {
            selectCandidate(0);  // 默认选择第一个候选词
        } else if (!m_composingText.isEmpty()) {
            // 无候选词时直接提交拼音（如特殊符号）
            commitText(m_composingText);
            resetState();
        }
        return;
    }

    // 处理字母/数字键（拼接拼音）
    appendComposingText(key);
    m_isComposing = true;
    emit compositionUpdated(m_composingText);
    // 触发拼音解析
    m_pinyinHandler->processInput(m_composingText);
}

// 选择候选词并提交
void InputContext::selectCandidate(int index)
{
    if (index < 0 || index >= m_currentCandidates.size()) {
        emit errorOccurred("候选词索引无效：" + QString::number(index));
        return;
    }

    // 获取选中词并提交
    QString selectedWord = m_currentCandidates[index].text;
    commitText(selectedWord);

    // 若为用户词，提升词频
    if (m_currentCandidates[index].isUserWord) {
        UserDict::getInstance()->updateFrequency(selectedWord);
    }

    // 重置输入状态
    resetState();
}

// 提交文本（通知UI层）
void InputContext::commitText(const QString& text)
{
    if (text.isEmpty()) return;
    emit textCommitted(text);
    qInfo() << "[InputContext] 提交文本：" << text;
}

// 取消当前输入
void InputContext::cancelInput()
{
    resetState();
    emit inputCanceled();
}

// 设置拼音输入类型
void InputContext::setInputMode(PinyinType type)
{
    if (m_currentPinyinType == type) return;
    m_currentPinyinType = type;
    m_pinyinHandler->setPinyinType(type);
    qInfo() << "[InputContext] 拼音类型更新为：" << static_cast<int>(type);
    resetState();  // 类型变更后重置输入
}

// 同步简繁转换方向
void InputContext::syncConvertDirection(OpenCCUtil::ConvertDirection dir)
{
    if (m_currentConvertDir == dir) return;
    m_currentConvertDir = dir;
    m_pinyinHandler->setConvertDirection(dir);
    qInfo() << "[InputContext] 简繁方向更新为：" << static_cast<int>(dir);
    // 重新解析当前拼音以刷新候选词
    if (!m_composingText.isEmpty()) {
        m_pinyinHandler->processInput(m_composingText);
    }
}

// 同步百度API开关
void InputContext::syncUseBaiduApi(bool use)
{
    if (m_currentUseBaiduApi == use) return;
    m_currentUseBaiduApi = use;
    m_pinyinHandler->setUseBaiduApi(use);
    qInfo() << "[InputContext] 百度API开关更新为：" << (use ? "启用" : "禁用");
    // 重新解析当前拼音以刷新候选词
    if (!m_composingText.isEmpty()) {
        m_pinyinHandler->processInput(m_composingText);
    }
}

// 拼音解析完成回调
void InputContext::onPinyinProcessed(const QVector<PinyinCandidate>& candidates)
{
    m_currentCandidates = candidates;
    emit candidatesUpdated(m_currentCandidates);
    qInfo() << "[InputContext] 候选词更新，数量：" << candidates.size();
}

// 词典更新时刷新候选词
void InputContext::onDictUpdated()
{
    if (!m_composingText.isEmpty()) {
        m_pinyinHandler->processInput(m_composingText);
    }
}

// 重置输入状态
void InputContext::resetState()
{
    m_composingText.clear();
    m_currentCandidates.clear();
    m_isComposing = false;
    emit compositionUpdated(m_composingText);
    emit candidatesUpdated(m_currentCandidates);
}

// 过滤无效按键
bool InputContext::isValidKey(const QString& key)
{
    // 允许的按键：字母(a-z/A-Z)、数字(0-9)、退格(Backspace)、空格、回车(Enter)
    return key == "Backspace" || key == " " || key == "Enter" ||
           QRegularExpression("[a-zA-Z0-9]").match(key).hasMatch();
}

// 拼接拼音（统一转为小写）
void InputContext::appendComposingText(const QString& key)
{
    m_composingText += key.toLower();
}